home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 2: CDPD 1
/
Almathera Ten on Ten - Disc 2: CDPD 1.iso
/
pd
/
201-225
/
214
/
mandelvroom
/
src
/
showhelp.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-13
|
12KB
|
425 lines
/*
* browser - Rummage around on disks.
*
* copyright (c) 1986, Mike Meyer
*
* Permission is hereby granted to distribute this program, so long as this
* source file is distributed with it, and this copyright notice is not
* removed from the file.
*
* Hacked up to be used as file displayer within MandelVroom. By Kevin
* Clague
*/
#include "mandp.h"
#define INTUITION_REV 1L
#define GRAPHICS_REV 1L
#define LONGEST_NAME 80 /* Longest file name we can deal with */
#define LONGEST_LINE 256 /* Longest line we will deal with */
#define AVG_LINE_LENGTH 40 /* A guess, tune it if you need to */
#define UP_GADGET ((unsigned short) 0)
#define DOWN_GADGET ((unsigned short) 1)
#define SCROLL_GADGET ((unsigned short) 2)
#define GWIDTH 16 /* Width of my two gadgets */
#define GHEIGHT 9 /* and their heights */
#define FIRST 18L
/*
* Pictures for the up and down arrows
*/
USHORT arrows[2][GHEIGHT] = {
{0xFE7F,
0xFC3F,
0xF81F,
0xF00F, /* Up */
0xFE7F,
0xFE7F,
0xFE7F,
0xFE7F,
0xFE7F
},{
0xFE7F,
0xFE7F,
0xFE7F,
0xFE7F, /* Down */
0xFE7F,
0xF00F,
0xF81F,
0xFC3F,
0xFE7F}
} ;
/*
* Now, the Image structures that use the arrows
*/
struct Image Arrow_Image[2] = {
{0, 0, GWIDTH, GHEIGHT, 1, NULL, 1, 0, NULL}, /* Up */
{0, 0, GWIDTH, GHEIGHT, 1, NULL, 1, 0, NULL} /* Down */
};
/*
* Now, my Gadget structures
*/
static struct PropInfo prop;
static struct Image prop_img;
static struct Gadget Scroll_Gadget = {
/*(struct Gadget *)*/ NULL, /* End of Gadgets */
0,10+GHEIGHT, /* Left, Top */
GWIDTH, -((GHEIGHT*2)+11),
GRELHEIGHT | GADGHCOMP,
GADGIMMEDIATE|FOLLOWMOUSE|RELVERIFY, /* Messages when released */
PROPGADGET,
(APTR) &prop_img,
(APTR) NULL, /* No rendering image, using HCOMP */
/*(struct IntuiText *)*/ NULL,
0L, /* No mutex */
(APTR) &prop,
HELPSCROLL, /* Yes, this is the scroll gadget */
(APTR) NULL /* And nothing of mine */
};
static struct Gadget Up_Gadget = {
&Scroll_Gadget, /* next gadget is scroll */
0,10, /* Left, Top */
GWIDTH, GHEIGHT,
GADGIMAGE | GADGHCOMP,
GADGIMMEDIATE, /* Messages when released */
BOOLGADGET, /* These be boolean gadgets */
(APTR) &(Arrow_Image[UP_GADGET]),
(APTR) NULL, /* No rendering image, using HCOMP */
/*(struct IntuiText *)*/ NULL,
0L, /* No mutex */
(APTR) NULL, /* Nothing special */
HELPUP, /* Yes, this is the up gadget */
(APTR) NULL /* And nothing of mine */
};
static struct Gadget Down_Gadget = {
&Up_Gadget, /* Next gadget is Up_Gadget */
0, -GHEIGHT, /* Left, Top */
GWIDTH, GHEIGHT,
GRELBOTTOM | GADGIMAGE | /* Standard bottom border gadget */
GADGHCOMP,
GADGIMMEDIATE | BOTTOMBORDER, /* Messages when released */
BOOLGADGET, /* These be boolean gadgets */
(APTR) &(Arrow_Image[DOWN_GADGET]),
(APTR) NULL, /* No rendering image, using HCOMP */
/*(struct IntuiText *)*/ NULL,
0L, /* No mutex */
(APTR) NULL, /* Nothing special */
HELPDOWN, /* Yes, this is the up gadget */
(APTR) NULL /* And nothing of mine */
};
/*
* Now, the window for it all
*/
static struct NewWindow New_Window = {
#ifdef DEBUG
0, 0, 320, 150, /* smaller window to left printf's show up */
#else
0, 1, 320, 199, /* Full screen */
#endif
-1L, -1L, /* Default pens */
NULL, /* Window closes and gadgets */
ACTIVATE /* Standard window */
| SMART_REFRESH | NOCAREREFRESH | SIZEBBOTTOM
| WINDOWSIZING | WINDOWDEPTH | WINDOWCLOSE | WINDOWDRAG,
&Down_Gadget, /* Add my gadgets */
/*(struct Image *)*/ NULL,
(UBYTE *) "MandelVroom Help Window", /* Title */
/*(struct Screen *)*/NULL,
/*(struct BitMap *)*/NULL,
100, 40, /* Minimum sizes */
-1, -1, /* Maximum sizes */
CUSTOMSCREEN
} ;
/*
* My very own variables (mostly for done)
*/
struct Window *HelpWind = NULL ;
static FILE *infile = NULL ; /* Current input file */
static void Page_File();
char HelpOpen;
/*
* Finally, declare the string twiddling functions as voids
*/
void strcat(), strcpy(), strncat();
AllocArrows()
{
extern USHORT *MakeChipSprite();
Arrow_Image[0].ImageData = MakeChipSprite( arrows[0], GHEIGHT );
Arrow_Image[1].ImageData = MakeChipSprite( arrows[1], GHEIGHT );
}
FreeArrows()
{
USHORT *Temp;
Temp = Arrow_Image[0].ImageData;
if (Temp)
FreeMem( (char *) Temp, (long) sizeof(arrows[0]));
Arrow_Image[0].ImageData = NULL;
Temp = Arrow_Image[1].ImageData;
if (Temp)
FreeMem( (char *) Temp, (long) sizeof(arrows[0]));
Arrow_Image[1].ImageData = NULL;
}
/*
* Display_File - given a directory path and file name, put the first page of
* the file in the window.
*/
long aprox_lines, file_size;
long Page_Length = 22L;
static int old_off, new_off;
static
Display_File(dir, name)
char *dir, *name;
{
static char File_Name[LONGEST_NAME];
FILE *fopen();
long ftell();
long i;
if (HelpWind == NULL)
return;
old_off = -1;
/* Get the file name */
strcpy(File_Name, dir);
strcat(File_Name, name);
if (infile != NULL)
fclose(infile);
if ((infile = fopen(File_Name, "r")) == NULL) {
CloseHelpWind(20, "can't open file") ;
return;
}
/* set up the prop gadget for scrolling */
fseek(infile, 0L, 2);
file_size = ftell(infile);
aprox_lines = file_size / AVG_LINE_LENGTH;
prop.Flags = FREEVERT | AUTOKNOB;
if (Page_Length >= aprox_lines)
i = 0xAAAA; /* guess 66% for small files */
else
i = (Page_Length * 0x10000) / aprox_lines; /* FFFF=100% - 0000=0% */
prop.VertBody = i;
prop.VertPot = 0; /* always start at begin of file */
fseek(infile, 0L, 0);
Page_File(HELPUP); /* Down from page 0 */
}
/*
* Page_File - move the file up or down one "page"
*/
void
Page_File(direction)
int direction;
{
register long where;
static char buffer[LONGEST_LINE];
static char edited[84]; /* allow room for a tab at end */
int end_flag = 0;
long tabs, size, Line_Length;
int i,j;
long new_pos;
char *p;
register struct Window *Window;
Window = HelpWind;
if (infile == NULL) return ;
Page_Length = (Window -> Height - 20) / 8 ;
Line_Length = (Window -> Width - (3+FIRST)) / 8;
switch (direction) {
case HELPUP: /* Seek back one page */
if (ftell(infile) < AVG_LINE_LENGTH * (Page_Length + 2))
fseek(infile, 0L, 0);
else {
fseek(infile, (long) -Page_Length * AVG_LINE_LENGTH, 1) ;
fgets(buffer, LONGEST_LINE, infile) ;
}
break;
case HELPDOWN:
break;
case HELPSCROLL:
/* compute new position based on the users scroll bar pot */
new_pos = (file_size * prop.VertPot) / 0x10000;
/* if at end of file, back up 1/2 page */
if (new_pos >= file_size)
new_pos = file_size - ((Page_Length / 2) * AVG_LINE_LENGTH);
fseek(infile, new_pos, 0);
/* discard a partial line */
if (new_pos)
fgets(buffer, LONGEST_LINE, infile);
new_off = ftell(infile);
if (new_off == old_off)
return;
old_off = new_off;
break;
default:
CloseHelpWind(20, "Illegal argument to Page_File");
return;
}
SetAPen(Window->RPort, NORMALPEN);
SetDrMd(Window->RPort, JAM1);
RectFill(Window->RPort, GWIDTH, 10,
Window->Width-2, Window->Height-10);
RectFill(Window->RPort, GWIDTH, Window->Height-10,
Window->Width-12-(YScale*4),
Window->Height);
BorderWindow( Window );
/* now put out one page's worth of the file's data */
for (where = 17, j = Page_Length; j--; where += 8) {
/* blank the buffer first */
for (i = 0; i < 80; i++)
edited[i] = ' ';
if (!end_flag) {
if (fgets(buffer, LONGEST_LINE, infile) == NULL)
end_flag = TRUE;
else {
size = strlen(buffer);
/* remove the newline */
buffer[size-1] = '\0';
size--;
p = buffer;
size = 0;
/* edit the buffer for tabs and non-printables */
while(*p) {
if (*p == '\t') {
do {
edited[size++] = ' ';
} while(size&3);
} else
if (*p < ' ') {
edited[size++] = '^';
edited[size++] = *p + '@';
} else
edited[size++] = *p;
p++;
/* mark the line as longer than the window */
if (size >= Line_Length) {
edited[size-1] = '>';
break;
}
}
}
}
SetAPen(Window->RPort, SHADOWPEN);
Move(Window -> RPort, FIRST+1, where+1) ;
Text(Window -> RPort, edited, Line_Length);
SetAPen(Window->RPort, HIGHLIGHTPEN);
Move(Window -> RPort, FIRST, where) ;
Text(Window -> RPort, edited, Line_Length);
} /* for 1 to size of window */
}
ShowHelp( DirName, FileName )
char *DirName, *FileName;
{
register struct IntuiMessage *message;
register unsigned short class, code ;
if (HelpWind == NULL) {
/* set up the scroll bar */
prop.Flags = FREEVERT | AUTOKNOB;
prop.VertBody = 0x1000;
New_Window.Screen = screen;
HelpWind = OpenMyWind(&New_Window,screen, NULL, 320, 200);
if (HelpWind == NULL){
CloseHelpWind(20, "can't open the window") ;
return;
}
if (HelpWind == NULL) return;
AddGList( HelpWind, &Down_Gadget, -1, -1);
RefreshGadgets( &Down_Gadget, HelpWind, NULL );
}
SetAPen(HelpWind->RPort, NORMALPEN);
SetDrMd(HelpWind->RPort, JAM1);
RectFill(HelpWind->RPort, GWIDTH, 10,
HelpWind->Width-2, HelpWind->Height-10);
RectFill(HelpWind->RPort, GWIDTH, HelpWind->Height-10,
HelpWind->Width-12-(YScale*4),
HelpWind->Height);
BorderWindow( HelpWind );
Display_File(DirName, FileName) ;
}
/*
* done - just close everything that's open, and exit.
*/
CloseHelpWind(how, why)
int how;
char *why;
{
if (HelpWind) {
CloseMyWind(HelpWind, NULL) ;
HelpWind = NULL;
if (infile) {
fclose(infile) ;
infile = NULL;
}
if (why)
DispErrMsg(why,0);
}
}